#include "omp.h"
#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> arr = {1, 2, 3, 4, 5};
    int size = arr.size();
    int sum = 0;
    int union_val = 0;
    /*
     * 加了reduction之后, 先会有局部的sum变量生成, 然后根据"op"赋值给sum的本地变量, 这里+号就意味着赋值0给sum
     * 编译器找到包括"op"的表达式并使用他们来更新本地拷贝
     * 本地拷贝变成单一值并与原始的全局值组合
     */
#pragma omp parallel for reduction (+:sum) reduction (|:union_val)
    for (int i = 0; i < size; i++) {
        sum += arr[i];
        union_val |= arr[i];
    }
    printf("%d %d\n", sum, union_val);
    return 0;
}